home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyo (Python 2.5)
-
- import sys
- import inspect
- import compiler.ast as compiler
- import thread
- import time
- DEBUG = False
- all_ast_nodes = frozenset((lambda .0: for name, obj in .0:
- if inspect.isclass(obj) and issubclass(obj, compiler.ast.Node):
- namecontinue)(inspect.getmembers(compiler.ast)))
- import __builtin__
- all_builtins = set(dir(__builtin__))
-
- def classname(obj):
- return obj.__class__.__name__
-
-
- def is_valid_ast_node(name):
- return name in all_ast_nodes
-
-
- def is_valid_builtin(name):
- return name in all_builtins
-
-
- def get_node_lineno(node):
- if not node.lineno or node.lineno:
- pass
- return 0
-
- unallowed_ast_nodes = frozenset(('AssAttr', 'AssList', 'AssName', 'AssTuple', 'Assert', 'Assign', 'AugAssign', 'Backquote', 'Break', 'CallFunc', 'Class', 'Continue', 'Decorators', 'Exec', 'For', 'From', 'Function', 'Getattr', 'If', 'Import', 'Print', 'Printnl', 'Raise', 'Return', 'TryExcept', 'TryFinally', 'While', 'Yield'))
- unallowed_builtins = frozenset(('__import__', 'classmethod', 'compile', 'delattr', 'dir', 'eval', 'execfile', 'file', 'getattr', 'globals', 'hasattr', 'input', 'intern', 'locals', 'open', 'raw_input', 'reload', 'setattr', 'vars'))
- for ast_name in unallowed_ast_nodes:
- pass
-
- for name in unallowed_builtins:
- pass
-
-
- def is_unallowed_ast_node(kind):
- return kind in unallowed_ast_nodes
-
-
- def is_unallowed_builtin(name):
- return name in unallowed_builtins
-
- unallowed_attr = frozenset(('im_class', 'im_func', 'im_self', 'func_code', 'func_defaults', 'func_globals', 'func_name', 'tb_frame', 'tb_next', 'f_back', 'f_builtins', 'f_code', 'f_exc_traceback', 'f_exc_type', 'f_exc_value', 'f_globals', 'f_locals'))
-
- def is_unallowed_attr(name):
- if not name.startswith('__') or name.endswith('__'):
- pass
- return name in unallowed_attr
-
-
- class SafeEvalError(object):
-
- def __init__(self, errmsg, lineno):
- self.errmsg = errmsg
- self.lineno = lineno
-
-
- def __str__(self):
- return 'line %d : %s' % (self.lineno, self.errmsg)
-
-
-
- class SafeEvalASTNodeError(SafeEvalError):
- pass
-
-
- class SafeEvalBuiltinError(SafeEvalError):
- pass
-
-
- class SafeEvalAttrError(SafeEvalError):
- pass
-
-
- class SafeEvalVisitor(object):
-
- def __init__(self):
- self.errors = []
- for ast_name in all_ast_nodes:
- if getattr(self, 'visit' + ast_name, None):
- continue
-
- if is_unallowed_ast_node(ast_name):
- setattr(self, 'visit' + ast_name, self.fail)
- continue
- setattr(self, 'visit' + ast_name, self.ok)
-
-
-
- def walk(self, ast):
- self.visit(ast)
- return self.errors == []
-
-
- def visit(self, node, *args):
- fn = getattr(self, 'visit' + classname(node))
- if DEBUG:
- self.trace(node)
-
- fn(node, *args)
- for child in node.getChildNodes():
- self.visit(child, *args)
-
-
-
- def visitName(self, node, *args):
- name = node.getChildren()[0]
- lineno = get_node_lineno(node)
- if is_unallowed_builtin(name):
- self.errors.append(SafeEvalBuiltinError("access to builtin '%s' is denied" % name, lineno))
- elif is_unallowed_attr(name):
- self.errors.append(SafeEvalAttrError("access to attribute '%s' is denied" % name, lineno))
-
-
-
- def visitGetattr(self, node, *args):
- name = node.attrname
- lineno = get_node_lineno(node)
- if is_unallowed_attr(name):
- self.errors.append(SafeEvalAttrError("access to attribute '%s' is denied" % name, lineno))
-
-
-
- def ok(self, node, *args):
- pass
-
-
- def fail(self, node, *args):
- lineno = get_node_lineno(node)
- self.errors.append(SafeEvalASTNodeError("execution of '%s' statements is denied" % classname(node), lineno))
-
-
- def trace(self, node):
- print classname(node)
- for attr in dir(node):
- if attr[:2] != '__':
- print ' ', '%-15.15s' % attr, getattr(node, attr)
- continue
-
-
-
-
- class SafeEvalException(Exception):
- pass
-
-
- class SafeEvalCodeException(SafeEvalException):
-
- def __init__(self, code, errors):
- self.code = code
- self.errors = errors
-
-
- def __str__(self):
- return '\n'.join((lambda .0: for err in .0:
- str(err))(self.errors))
-
-
-
- class SafeEvalContextException(SafeEvalException):
-
- def __init__(self, keys, errors):
- self.keys = keys
- self.errors = errors
-
-
- def __str__(self):
- return '\n'.join((lambda .0: for err in .0:
- str(err))(self.errors))
-
-
-
- class SafeEvalTimeoutException(SafeEvalException):
-
- def __init__(self, timeout):
- self.timeout = timeout
-
-
- def __str__(self):
- return 'Timeout limit execeeded (%s secs) during exec' % self.timeout
-
-
-
- def exec_timed(code, context, timeout_secs):
- signal_finished = False
-
- def alarm(secs):
-
- def wait(secs):
- for n in xrange(timeout_secs):
- time.sleep(1)
- if signal_finished:
- break
- continue
-
-
- thread.start_new_thread(wait, (secs,))
-
-
- try:
- alarm(timeout_secs)
- exec code in context
- signal_finished = True
- except KeyboardInterrupt:
- (None, None)
- (None, None)
- raise SafeEvalTimeoutException(timeout_secs)
- except:
- (None, None)
-
-
-
- def safe_eval(code, context = None, timeout_secs = 5):
- if context is None:
- context = { }
-
- ctx_errkeys = []
- ctx_errors = []
- for key, obj in context.items():
- if inspect.isbuiltin(obj):
- ctx_errkeys.append(key)
- ctx_errors.append("key '%s' : unallowed builtin %s" % (key, obj))
-
- if inspect.ismodule(obj):
- ctx_errkeys.append(key)
- ctx_errors.append("key '%s' : unallowed module %s" % (key, obj))
- continue
-
- if ctx_errors:
- raise SafeEvalContextException(ctx_errkeys, ctx_errors)
-
- ast = compiler.parse(code)
- checker = SafeEvalVisitor()
- if checker.walk(ast):
- exec_timed(code, context, timeout_secs)
- else:
- raise SafeEvalCodeException(code, checker.errors)
-
-
- def pprintAst(ast, indent = ' ', stream = sys.stdout):
- rec_node(ast, 0, indent, stream.write)
-
-
- def rec_node(node, level, indent, write):
- pfx = indent * level
- if isinstance(node, compiler.ast.Node):
- write(pfx)
- write(node.__class__.__name__)
- write('(')
- if any((lambda .0: for child in .0:
- isinstance(child, compiler.ast.Node))(node.getChildren())):
- for i, child in enumerate(node.getChildren()):
- if i != 0:
- write(',')
-
- write('\n')
- rec_node(child, level + 1, indent, write)
-
- write('\n')
- write(pfx)
- else:
- write(', '.join((lambda .0: for child in .0:
- repr(child))(node.getChildren())))
- write(')')
- else:
- write(pfx)
- write(repr(node))
-
-